package com.common.library.util;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Environment;

public class FileUtils {
	
	public static final String TAG = FileUtils.class.getSimpleName();
	
	/**
	 * 
	 * function: 是否有sd卡
	 *
	 * @return
	 * 
	 * @ author: aXiBa 2013-3-31 下午3:25:16
	 */
	public static boolean hasSDCard(){
		boolean result = false;
		if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
			result = true;
		}
		return result;
	}
	
	
	public static String readContent(String path) {
		
		String content = "";
	
		try {
			File file = new File(path);
		
			if (file.exists() || file.isFile() || file.canRead()) {
			
				FileInputStream fis = new FileInputStream(file);
			
				byte[] buffer = new byte[fis.available()];
				fis.read(buffer);
				
				content = new String(buffer);
			} 
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return content;
	}
	
	
	/**
	 * 
	 * function: 将数组内容写入到文件中
	 *
	 * @param data
	 * @param path
	 * @param fileName
	 * @return
	 * @throws IOException
	 * 
	 * @ author: aXiBa 2013-3-14 下午4:23:50
	 */
	public static String writeContent2File(byte[] data, String path, String fileName) throws IOException {

		// ///////////////////////////////////////////////
		// 创建文件
		// ////////////////////////////////////////////////
		createFile(path, fileName);

		// ///////////////////////////////////////////////
		// 将内容写入到文件中
		// ////////////////////////////////////////////////
		writeByteToFile(data, new File(path + fileName));

		return path + fileName;

	}
	
	
	
	/**
	 * 
	 * function: 将数组内容写入到文件中: 如果文件原来存在则删除
	 *
	 * @param data
	 * @param path
	 * @param fileName
	 * @return
	 * @throws IOException
	 * 
	 * @ author: aXiBa 2012-5-10 下午4:13:23
	 */
	public static String writeContent2FileWithDelete(byte[] data, String path, String fileName) throws IOException {
		
		// ///////////////////////////////////////////////
		// 创建文件
		// ////////////////////////////////////////////////
		createFileWithDelete(path, fileName);
		
		// ///////////////////////////////////////////////
		// 将内容写入到文件中
		// ////////////////////////////////////////////////
		writeByteToFile(data, new File(path + fileName));
		
		return path + fileName;
		
	}
	
	
	
	/**
	 * 
	 * function: 将输入流写入到文件中
	 *
	 * @param input
	 * @param path
	 * @param fileName
	 * @return
	 * @throws Exception 
	 * @throws IOException
	 * 
	 * @ author: aXiBa 2011-4-27 上午10:53:37
	 */
	public static String writeContent2File(InputStream input, String path, String fileName) throws Exception {

		// ///////////////////////////////////////////////
		// 创建文件
		// ////////////////////////////////////////////////
		createFile(path, fileName);

		// ///////////////////////////////////////////////
		// 将内容写入到文件中
		// ////////////////////////////////////////////////
		writeByteToFile(readStream(input), new File(path + fileName));

		return path + fileName;

	}
	
	
	
	/**
	 * 
	 * function: 将字符内容写入到文件中
	 *
	 * @param data
	 * @param path
	 * @param fileName
	 * @return
	 * @throws IOException
	 * 
	 * @ author: aXiBa 2013-3-14 下午4:24:54
	 */
	public static String writeContent2File(String data, String path, String fileName) throws IOException {

		// ///////////////////////////////////////////////
		// 创建文件
		// ////////////////////////////////////////////////
		createFile(path, fileName);

		// ///////////////////////////////////////////////
		// 将内容写入到文件中
		// ////////////////////////////////////////////////
		writeByteToFile(data.getBytes(), new File(path + fileName));

		return path + fileName;

	}
	
	
	/**
	 * 
	 * function: 创建文件: 当文件存在时删除
	 *
	 * @param path
	 * @param fileName
	 * @return
	 * 
	 * @ author: aXiBa 2012-5-10 下午4:09:41
	 */
	public static void createFileWithDelete(String path, String fileName) {

		// ///////////////////////////////////////
		// 创建目录
		// ///////////////////////////////////////
		File dir = new File(path);

		if (!dir.exists()) {
			boolean flag = dir.mkdirs();
			if(!flag){
				System.gc();
				File dirSon = new File(path);
				dirSon.mkdir();
			}
		}else if(!dir.canWrite()){
			dir.delete();
			File dirSon = new File(path);
			dirSon.mkdirs();
			
		}

		// //////////////////////////////////////////
		// 创建文件: 存在时删除
		// ///////////////////////////////////////////
		File file = new File(path + fileName);

		if (file.exists()||file.isFile()) {
			file.delete();
		} 
		
		try {
		    file.createNewFile();
		} catch (IOException e) {
			
			e.printStackTrace();
		}

	}

	
	public static boolean createFile(String path, String fileName) {
		
		// ///////////////////////////////////////
		// 创建目录
		// ///////////////////////////////////////
		File dir = new File(path);
		
		if (!dir.exists()) {
			boolean flag = dir.mkdirs();
			if(!flag){
				System.gc();
				File dirSon = new File(path);
				dirSon.mkdir();
			}
		}else if(!dir.canWrite()){
			dir.delete();
			File dirSon = new File(path);
			dirSon.mkdirs();
			
		}
		
		// //////////////////////////////////////////
		// 创建文件
		// ///////////////////////////////////////////
		File file = new File(path + fileName);
		
		
		if (file.exists()||file.isFile()) {
			
			return false;
			
		} else {
			
			try {
				file.createNewFile();
			} catch (IOException e) {
				
				e.printStackTrace();
			}
		}
		
		return true;
	}
	
	
	
	
	/**
	 * 创建目录
	 * 
	 * @param path
	 * @return
	 * 
	 * added By Louis on 2010-11-26 & memoryCat V1.0
	 *
	 */
	public static boolean createDir(String path) {

		// ///////////////////////////////////////
		// 创建SD卡目录
		// ///////////////////////////////////////
		File dir = new File(path);

		if (!dir.exists()) {
			return dir.mkdirs();
		}
		
		return true;
	}


//	public static boolean createAPKDir(Context context,String path) {
//
//		// ///////////////////////////////////////
//		// 创建SD卡目录
//		// ///////////////////////////////////////
//		File dir = new File(path);
//
//
//		File dir = getDir("aaa", Context.MODE_PRIVATE | Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);
//
//		if (!dir.exists()) {
//			return dir.mkdirs();
//		}
//
//		return true;
//	}





	/**
	 * 
	 * function: 删除某个目录以及目录下所有文件
	 *
	 * @param path
	 * 
	 * @ author: aXiBa 2012-1-13 上午11:04:24
	 */
	public static void deleteDir(String path) {
		// ///////////////////////////////////////
		// 删除SD卡目录
		// ///////////////////////////////////////
		doDeleteDir(path, true);
	}
	
	
	
	
	
	/**
	 * 
	 * function: 清空SD卡下某个目录下所有文件，但是保留目录
	 *
	 * @param path
	 * 
	 * @ author: aXiBa 2012-1-13 上午11:04:12
	 */
	public static void clearDir(String path) {

		// ///////////////////////////////////////
		// 清空SD卡目录
		// ///////////////////////////////////////
		doDeleteDir(path, false);
	}
	
	
	
	/**
	 * 
	 * function: 
	 *
	 * @param path
	 * @param isDelRoot
	 * 
	 * @ author: aXiBa 2012-1-13 上午11:04:34
	 */
	private static void doDeleteDir(String path, boolean isDelDir) {
		
		File dir = new File(path);

		if (dir.exists()) {
			File[] files = dir.listFiles();

			for (File file : files) {
				
				if(file.isFile()) {
					
					file.delete();
				}
				else if(file.isDirectory()) {
					doDeleteDir(file.getPath(), isDelDir);
				}
			}
			
			if(isDelDir) {
				dir.delete();
			}
		}
	}
	
	
	
	
	/**
	 * 打开文件
	 * 
	 * @param f
	 * @param act
	 * 
	 * @author Louis on 2010-12-11 & memoryCat V1.0
	 * 
	 */
	public static void openFile(File f, Activity act) {
		Intent intent = new Intent();
		intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
		intent.setAction(Intent.ACTION_VIEW);

		/* 调用getMIMEType()来取得MimeType */
		String type = getMIMEType(f);

		/* 设定intent的file与MimeType */
		intent.setDataAndType(Uri.fromFile(f), type);

		act.startActivity(intent);
	}

	
	
	
	
	/**
	 * 判断文件MimeType的method
	 * 
	 * @param f
	 * @return
	 * 
	 * @author Louis on 2010-12-11 & memoryCat V1.0
	 * 
	 */
	private static String getMIMEType(File f) {
		String type = "";
		String fName = f.getName();

		/* 取得扩展名 */
		String end = fName.substring(fName.lastIndexOf(".") + 1, fName.length()).toLowerCase();

		/* 按扩展名的类型决定MimeType */
		if (end.equals("m4a") || end.equals("mp3") || end.equals("mid") || end.equals("xmf") || end.equals("ogg") || end.equals("wav")) {
			type = "audio";
		} else if (end.equals("3gp") || end.equals("mp4")) {
			type = "video";
		} else if (end.equals("jpg") || end.equals("gif") || end.equals("png") || end.equals("jpeg") || end.equals("bmp")) {
			type = "image";
		} else if (end.equals("apk")) {
			return "application/vnd.android.package-archive";
		} else {
			type = "*";
		}
		/* 如果无法直接打开，就弹出软件列表给用户选择 */
		type += "/*";
		return type;
	}
	
	
	/**
	 * 
	 * function: 将流转换成byte[]
	 *
	 * @param inStream
	 * @return
	 * @throws Exception
	 * 
	 * @ author: aXiBa 2013-3-14 下午4:10:49
	 */
	private static byte[] readStream(InputStream inStream) {      
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();      
        byte[] buffer = new byte[1024];      
        int len = 0;      
        try {
			while( (len=inStream.read(buffer)) != -1){      
			    outStream.write(buffer, 0, len);      
			}
			outStream.close();      
			inStream.close();      
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
        
        return outStream.toByteArray();      
    }
	
	
	/**
	 * 
	 * function: 写入文件
	 *
	 * @param bitmapByte
	 * @param file
	 * 
	 * @ author: aXiBa 2013-3-14 下午4:25:25
	 */
	public static void writeByteToFile(byte[] bitmapByte, File file) {
		if (Helper.isNotEmpty(bitmapByte)) {

			OutputStream outputStream = null;
	
			try {
				outputStream = new FileOutputStream(file);
				outputStream.write(bitmapByte);
				bitmapByte = null;
			} catch (FileNotFoundException e) {
				e.printStackTrace();
				LogUtil.e(TAG, "FileNotFoundException:" + e.getMessage());
			} catch (IOException e) {
				e.printStackTrace();
				LogUtil.e(TAG, "IOException:" + e.getMessage());
			}
			if(Helper.isNotNull(outputStream)){
				try {
					outputStream.close();
				} catch (IOException e) {
					e.printStackTrace();
					LogUtil.e(TAG, "写入文件出错" + e.getMessage());
				}
				outputStream = null;
			}
		}
	}

	
	/**
	 * 
	 * function: 内部file目录: /data/data/包名/files
	 *
	 * @return
	 * 
	 * @ author: aXiBa 2013-12-11 下午3:11:19
	 */
	public static String getInternalFileDir() {
		
		return ActivityHelper.getGlobalApplicationContext().getFilesDir().getAbsolutePath().concat(File.separator);
	}
	
//	/**
//	 * 
//	 * function: 内部cache目录: /data/data/包名/cache 
//	 *
//	 * @return
//	 * 
//	 * @ author: aXiBa 2013-12-11 下午3:11:34
//	 */
	public static String getInternalCacheDir() {

		return ActivityHelper.getGlobalApplicationContext().getCacheDir().getAbsolutePath().concat(File.separator);
	}
//	
//	/**
//	 * 
//	 * function: 外部file目录: sd卡目录/Android/data/files
//	 *
//	 * @return
//	 * 
//	 * @ author: aXiBa 2013-12-11 下午3:12:51
//	 */
//	public static String getExternalFileDir() {
//		
//		String path = "";
//		if(hasSDCard()) {
//			path = ActivityHelper.getGlobalApplicationContext().getExternalFilesDir(null).getAbsolutePath().concat(File.separator);
//		}
//		return path; 
//	}
//	
//	/**
//	 * 
//	 * function: 外部cache目录: sd卡目录/Android/data/cache
//	 *
//	 * @return
//	 * 
//	 * @ author: aXiBa 2013-12-11 下午3:13:20
//	 */
//	public static String getExternalCacheDir() {
//		
//		String path = "";
//		if(hasSDCard()) {
//			path = ActivityHelper.getGlobalApplicationContext().getExternalCacheDir().getAbsolutePath().concat(File.separator);
//		}
//		return path; 
//	}
	
	/**
	 * 
	 * function: sd卡根目录
	 *
	 * @return
	 * 
	 * @ author: aXiBa 2013-12-11 下午3:13:38
	 */
	public static String getSDCardRootDir() {
		
		String path = "";
		if(hasSDCard()) {
			path = Environment.getExternalStorageDirectory().getAbsolutePath().concat(File.separator);
		}
		return path; 
	}
	
	
	
	
}
